home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
ami_sys
/
ovl_src
/
filter0.c
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
4KB
|
130 lines
#include <stdlib.h>
#include <string.h>
#include <DOS.h> /* _FP_SEG(), _FP_OFF() */
#include <egb.h>
#include <msdos.cf>
#include <loader.h> /* pcl_exit() を使うため */
/* 拡張ライブラリ1 があった方がよい */
/* 元に戻れるようにディレクトリは移動しない */
#define GETVRAM(buf, x1,y1,x2,y2) \
{ struct {char *bp; short sel; short sx,sy,ex,ey;} p; \
p.bp=(char *)buf; p.sel=getds(); \
p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
EGB_writePage(gwork,0); \
EGB_getBlock( gwork, (char *)&p ); }
#define PUTVRAM(buf, x1,y1,x2,y2) \
{ struct {char *bp; short sel; short sx,sy,ex,ey;} p; \
p.bp=(char *)buf; p.sel=getds() ; \
p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
EGB_writePage( gwork,0); \
EGB_putBlock( gwork, 0, (char *)&p ); }
#define LINE(x1,y1,x2,y2,c,m) \
{ struct { short n,sz,sy,ex,ey;} p; \
p.n=2;p.sz=x1; p.sy=y1; p.ex=x2; p.ey=y2; \
EGB_writePage(gwork,1); \
EGB_color(gwork,0,c); \
EGB_writeMode(gwork,m); \
EGB_connect(gwork,(char*)&p); }
char *gwork; /* EGB用 ワーク領域 */
unsigned short (*awork)[320]; /* VRAMの複写領域 */
void screen_get()
{
/* 最初は EGB_init を使わないで画面設定します */
memset( gwork, 0, EgbWorkSize ); /* 念のため0クリア */
EGB_displayPage(gwork,0,0); /* 意味ないかもしれない */
EGB_resolution(gwork,0,10); /* page=0; 32Kmode */
EGB_resolution(gwork,1, 3); /* page=1; 16mode */
GETVRAM(&awork[0][0],0,0,319,239); /* VRAMをワーク領域に複写 */
return ;
}
void screen_set()
{
/* 改めて正式に初期化します */
EGB_init(gwork,EgbWorkSize);
EGB_resolution(gwork,0,10); /* page=0; 32Kmode */
EGB_resolution(gwork,1, 3); /* page=1; 16mode */
EGB_writePage(gwork,0); /* page0 設定 */
EGB_displayStart(gwork,3,0,0);
EGB_displayStart(gwork,2,2,2);
EGB_displayStart(gwork,0,0,0);
EGB_displayStart(gwork,1,0,0);
EGB_displayStart(gwork,3,320,240);
EGB_writePage(gwork,1); /* page1 設定 */
EGB_displayStart(gwork,3,0,0);
EGB_displayStart(gwork,2,1,1);
EGB_displayStart(gwork,0,0,0);
EGB_displayStart(gwork,1,0,0);
EGB_displayStart(gwork,3,640,480);
return ;
}
void main(void)
{
awork=malloc( 240*320* sizeof(short) );
if(awork==NULL) return ;
gwork=malloc( EgbWorkSize*sizeof(char) );
if(gwork==NULL) return ;
screen_get();
screen_set();
EGB_displayPage(gwork,1,3); /* page1 前 */
EGB_writePage(gwork,0);
PUTVRAM( &awork[0][0], 0,0,319,239); /* 画面復帰 */
sub();
pcl_exit(0);
return ;
}
sub()
{
int level=16;
flat(level);
return 0;
}
int flat(int level)
{
_far unsigned short *vram1;
int i,j;
#define COLSP(x,g,r,b) { b=x & 0x001f; r=(x & 0x03e0)>>5; g=x>>10;}
#define COLCN(x,g,r,b) { x = b | (r<<5) | (g<<10); }
#define COLDF(g1,r1,b1,g2,r2,b2) ( _abs((g2)-(g1))+_abs((r2)-(r1))+_abs((b2)-(b1)))
_FP_SEG( vram1 ) = 0x104; /* 又は 0x10c */
_FP_OFF( vram1 ) = 0;
for( j=1; j<239; j++)
{
for( i=1; i<319; i++)
{
int k,n,av,ag,ar,ab, g[9],r[9],b[9];
av=awork[j][i]; COLSP( av, ag, ar, ab);
av=awork[j-1][i-1]; COLSP( av, g[0], r[0], b[0]);
av=awork[j-1][i ]; COLSP( av, g[1], r[1], b[1]);
av=awork[j-1][i+1]; COLSP( av, g[2], r[2], b[2]);
av=awork[j ][i-1]; COLSP( av, g[3], r[3], b[3]);
av=awork[j ][i ]; COLSP( av, g[8], r[8], b[8]);
av=awork[j ][i+1]; COLSP( av, g[4], r[4], b[4]);
av=awork[j+1][i-1]; COLSP( av, g[5], r[5], b[5]);
av=awork[j+1][i ]; COLSP( av, g[6], r[6], b[6]);
av=awork[j+1][i+1]; COLSP( av, g[7], r[7], b[7]);
for(n=1,k=0;k<8;k++)
{
if( COLDF( g[8],r[8],b[8],g[k],r[k],b[k] ) <= level )
{ag+=g[k];ar+=r[k];ab+=b[k];n++;}
}
ag/=n;ar/=n;ab/=n;
COLCN( av, ag, ar, ab);
/* awork[j][i]=vram1[j*512+i]=av ; */
vram1[j*512+i]=av ;
}
LINE(632,j*2,639,j*2,4,4);
}
return 0;
}